package ec.edu.ups.cidi.siia.plamdep.analizadorLexico.analisis;
import ec.edu.ups.cidi.siia.plamdep.configuracion.ConfiguracionAnalisiLexico;
import ec.edu.ups.cidi.siia.plamdep.configuracion.ConfiguracionGlobal;
import ec.edu.ups.cidi.siia.plamdep.modelo.analizadorLexico.Palabra;
import ec.edu.ups.cidi.siia.plamdep.modelo.analizadorLexico.Parrafo;
import ec.edu.ups.cidi.siia.plamdep.utils.ArchivosManager;
import ec.edu.ups.cidi.siia.plamdep.utils.Log;
import edu.upc.freeling.*;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 *
 * @author Herny
 */
public class AnalisisFreeling 
{
    
//   Modify this line to be your FreeLing installation directory

//   private static final String FREELINGDIR = "/opt/bin/freeling/";
//   private static final String DATA ="/usr/local/share/freeling";
 
    private static final String FREELINGDIR = ConfiguracionAnalisiLexico.freelingdir;
    private static final String DATA =FREELINGDIR+"/data/";
    private static ArchivosManager archivo;
    private static final String LANG = ConfiguracionAnalisiLexico.lenguaje;
    private Maco analizadorMaco;
    private HmmTagger analizadorTagger;
    private Senses sen;
    
    public  AnalisisFreeling()
     {
    	
       if(ConfiguracionAnalisiLexico.tipoAnalisis.equalsIgnoreCase("API")) 
       {	
    	  
    	   Log.log(null,Log.MOD_ANLS_LEXICO,Log.LEVEL_LOAD, AnalisisFreeling.class,"*Arrancando API de Freeling.....");
    	   Log.log(null,Log.MOD_ANLS_LEXICO,Log.LEVEL_LOAD, AnalisisFreeling.class,"* FREELINGDIR:"+FREELINGDIR);
    	   Log.log(null,Log.MOD_ANLS_LEXICO,Log.LEVEL_LOAD, AnalisisFreeling.class,"* LENGUAJE:"+LANG);
    	   inicializarModulos();
       
       }
 	   else if(ConfiguracionAnalisiLexico.tipoAnalisis.equalsIgnoreCase("consola"))
    	
 		  Log.log(null,Log.MOD_ANLS_LEXICO,Log.LEVEL_LOAD, AnalisisFreeling.class,"* Arrancando Freeling en consola.....");


     }
    public void inicializarModulos()
    {
    Log.log(null,Log.MOD_ANLS_LEXICO,Log.LEVEL_LOAD, AnalisisFreeling.class,"* Cargando modulos de Freeling.....");
    Log.log(null,Log.MOD_ANLS_LEXICO,Log.LEVEL_LOAD, AnalisisFreeling.class,"freeling_javaAPI");
    Util.initLocale( "default" );
    MacoOptions op = new MacoOptions( LANG );
      op.setActiveModules(false, true, true, true, true, true, true, true, true, true);

    op.setDataFiles(
      "", 
      DATA+LANG+"/locucions.dat", 
      DATA + LANG + "/quantities.dat",
      DATA + LANG + "/afixos.dat",
      DATA + LANG + "/probabilitats.dat",
      DATA + LANG + "/dicc.src",
      DATA + LANG + "/np.dat",
      DATA + "common/punct.dat");
     
     analizadorMaco = new Maco( op );    
     analizadorTagger = new HmmTagger( DATA + LANG + "/tagger.dat", true, 2 );
      sen = new Senses(DATA + LANG + "/senses.dat" ); // sense dictionary
     
     Log.log(null,Log.MOD_ANLS_LEXICO,Log.LEVEL_SUCESS, AnalisisFreeling.class,"* Listo...");

    }
    
      private Sentence crearOracion(String texto)
      {
            String []palabras =texto.split(" ");
            Sentence oracion=new Sentence();
            for(int i=0;i<palabras.length;i++)
                if(palabras[i].trim().length()>0)
                    oracion.pushBack(new Word(palabras[i]));
            return oracion;
      }
 
      /**
       * realiza un analisis de acuerdo al contexto del texto
       * @param texto a analizar
       * @return 
       */ 
     public  List<Palabra>  analisisTagger(String texto)
      {
         Sentence oracion=this.crearOracion(texto);
         analizadorMaco.analyze(oracion);
         sen.analyze( oracion );
         ArrayList<Palabra> palabras=new ArrayList<Palabra> ();
         this.analizadorTagger.analyze(oracion);
         ListWordIterator wIt = new ListWordIterator(oracion);
         while (wIt.hasNext()) {
            Word w1 = wIt.next();
               
             Palabra p=new Palabra(w1.getForm());
                            p.setTipo(w1.getTag());
                            p.setLema(w1.getLemma());
                            palabras.add(p);
            
            
          }
          return  palabras;
      }
      
     
    /**
     * realiza un analisis de acuerdo al modo en el que este arrancado el recurso de Freeling,
     * pudiendo ser a traves del API o capturando la consola
     * @param texto a analizar
     * @return 
     */ 
   public  List<Palabra>  analisis(String texto)
    {
	   if(ConfiguracionAnalisiLexico.tipoAnalisis.equalsIgnoreCase("API"))
		   return analisisTagger(texto);
	   else if(ConfiguracionAnalisiLexico.tipoAnalisis.equalsIgnoreCase("consola"))
		  return analisisConsola(texto);
        return  null;
    }
    
    public List<Palabra>  analisisConsola(String texto)
    {
    	List<Palabra> palabras=new ArrayList<Palabra>();
    	 try {
    			
    		 archivo=new ArchivosManager(ConfiguracionGlobal.pathResources+"/freeling_consola_utils/tem.txt");
    		 archivo.escribir(texto);
    			
    		String comando=ConfiguracionAnalisiLexico.instruccionConsola;
    		 Log.log(null,Log.MOD_ANLS_LEXICO,Log.LEVEL_MSG, AnalisisFreeling.class,"Ejecutando por consola:");
    	 	Runtime rt=Runtime.getRuntime();
    	 	Process	 proc=rt.exec(comando);
    	 	//proc.waitFor();
    	 	BufferedReader stdInput = new BufferedReader(new  InputStreamReader(proc.getInputStream()));
    	 		
    	 	String s = null;
    	 		
    	 		
    	 		while ((s = stdInput.readLine()) != null)
    	 		{
    	 			String [] datos=s.split(" ");	
    	 			Log.log(null,Log.MOD_ANLS_LEXICO,Log.LEVEL_MSG, AnalisisFreeling.class,"tam"+datos.length+"\t"+s);
    	 			if(datos.length==4)
    	 			{	
    	 				String pal=datos[0];
    	 				String lema=datos[1];
    	 				String eagle=datos[2];
    	 				
    	  				Palabra p=new Palabra(pal);
    	  				p.setTipo(eagle);
    	  				p.setLema(lema);
    	 			    palabras.add(p);
    	 			
    	 			}
    	 		}
    	 		} catch (Exception e) {
    				e.printStackTrace();
    			
    			}
    	 		return palabras;
    		}
    
    
    
    
    
    
    
    public  List<Parrafo>  analisisConsola(String texto,boolean parrafo)
    {
    	String breakParrafo=" breakParrafo ";
    	List<Parrafo> parrafos=new ArrayList<Parrafo>();
    	Parrafo pa = new Parrafo("");
    	pa.setPalabras(new ArrayList<Palabra>());
    	parrafos.add(pa);
    	texto=texto.replaceAll("\n",breakParrafo );
    	 try {
    			
    		 archivo=new ArchivosManager(ConfiguracionGlobal.pathResources+"/freeling_consola_utils/tem.txt");
    		 archivo.escribir(texto);
    		 Log.log(null,Log.MOD_ANLS_LEXICO,Log.LEVEL_MSG, AnalisisFreeling.class,"graba:\n"+texto);
    		String comando=ConfiguracionAnalisiLexico.instruccionConsola;
    		Log.log(null,Log.MOD_ANLS_LEXICO,Log.LEVEL_MSG, AnalisisFreeling.class,"Ejecutando por consola:"+comando);
    	 	Runtime rt=Runtime.getRuntime();
    	 	Process	 proc=rt.exec(comando);
    	 	//proc.waitFor();
    	 	BufferedReader stdInput = new BufferedReader(new  InputStreamReader(proc.getInputStream()));
    	 		
    	 	String s = null;
    	 		
    	 		
    	 		while ((s = stdInput.readLine()) != null)
    	 		{
    	 			String [] datos=s.split(" ");
    	 		//	System.out.println("tam"+datos.length+"\t"+s);
    	 			if(datos.length==4)
    	 			{
    	 				
    	 				String pal=datos[0];
    	 				String lema=datos[1];
    	 				String eagle=datos[2];
    	 				if(pal.equalsIgnoreCase(breakParrafo.trim()))
    	 				{
    	 					Parrafo pa1 = new Parrafo("");
    	 			    	pa1.setPalabras(new ArrayList<Palabra>());
    	 			    	parrafos.add(pa1);	
    	 					continue;
    	 				}			
    	 					
    	 					
    	  				Palabra p=new Palabra(pal);
    	  				p.setTipo(eagle);
    	  				p.setLema(lema);
    	 			    
    	  				parrafos.get(parrafos.size()-1).addPalabra(p);
    	  				
    	 			
    	 			}
    	 		
    	 			
    	 			
    	 		}
    	 		} catch (Exception e) {
    			
    				
    				
    				Log.log(e,Log.MOD_ANLS_LEXICO,Log.LEVEL_WARNING, AnalisisFreeling.class,"Error ejecutando la consola:");
    			
    			}
    	 
    	 		for(int i=0;i<parrafos.size();i++)
    	 		{
    	 			Parrafo par=parrafos.get(i);
    	 			if(par.getPalabras().size()==0)
    	 			{
    	 				parrafos.remove(i);
    	 				i--;
    	 			}
    	 			
    	 		}
    	 		
    	 
    	 		return parrafos;
    		}
    
    
    
    
    /*
   
   public ArrayList<Palabra> analisisMaco(String texto)
    {
        ArrayList<Palabra> palabras=new ArrayList<Palabra> ();
        Sentence oracion=this.crearOracion(texto);
            try{    
                   analizadorMaco.analyze(oracion);
                    sen.analyze( oracion );
                    ListWordIterator wIt = new ListWordIterator(oracion);
                    while (wIt.hasNext()) 
                    {
                          Word w1 = wIt.next();
                          Palabra p=new Palabra(w1.getForm());
                          p.setTipo(w1.getTag());
                          p.setLema(w1.getLemma());
                          palabras.add(p);
                    }
              }catch(Exception ex){ex.printStackTrace(); }
    return palabras;
    }
    */
}
